package com.aspire.aimini.service;

import com.aspire.aimini.model.dto.MaterialDTO;
import com.aspire.aimini.model.dto.TagDTO;
import com.aspire.aimini.model.entity.AiConfig;

import java.util.List;
import java.util.Map;

/**
 * AI服务接口
 *
 * @author wangguiyou
 * @date 2024-01-01
 * @description AI相关业务逻辑接口
 */
public interface AiService {

    /**
     * 图片标签识别
     *
     * @param materialId 素材ID
     * @param userId     用户ID
     * @return 识别的标签列表
     */
    List<TagDTO> recognizeImageTags(Long materialId, Long userId);

    /**
     * 生成文案
     *
     * @param materialId   素材ID
     * @param contentType  内容类型
     * @param style        风格
     * @param customPrompt 自定义提示词
     * @param userId       用户ID
     * @return 生成的文案内容
     */
    String generateCopywriting(Long materialId, String contentType, String style, String customPrompt, Long userId);

    /**
     * 生成相似图片
     *
     * @param materialId 源素材ID
     * @param prompt     生成提示词
     * @param style      生成风格
     * @param userId     用户ID
     * @return 生成的素材
     */
    MaterialDTO generateSimilarImage(Long materialId, String prompt, String style, Long userId);

    /**
     * 图片内容分析
     *
     * @param materialId 素材ID
     * @param userId     用户ID
     * @return 分析结果
     */
    Map<String, Object> analyzeImageContent(Long materialId, Long userId);

    /**
     * 图片风格转换
     *
     * @param materialId  素材ID
     * @param targetStyle 目标风格
     * @param userId      用户ID
     * @return 转换后的素材
     */
    MaterialDTO convertImageStyle(Long materialId, String targetStyle, Long userId);

    /**
     * 图片背景移除
     *
     * @param materialId 素材ID
     * @param userId     用户ID
     * @return 处理后的素材
     */
    MaterialDTO removeImageBackground(Long materialId, Long userId);

    /**
     * 图片质量增强
     *
     * @param materialId  素材ID
     * @param enhanceType 增强类型
     * @param userId      用户ID
     * @return 增强后的素材
     */
    MaterialDTO enhanceImageQuality(Long materialId, String enhanceType, Long userId);

    /**
     * 文本转图片
     *
     * @param prompt 文本提示词
     * @param style  生成风格
     * @param size   图片尺寸
     * @param userId 用户ID
     * @return 生成的素材
     */
    MaterialDTO textToImage(String prompt, String style, String size, Long userId);

    /**
     * 图片转文本描述
     *
     * @param materialId 素材ID
     * @param language   语言
     * @param userId     用户ID
     * @return 文本描述
     */
    String imageToText(Long materialId, String language, Long userId);

    /**
     * 获取用户的AI配置
     *
     * @param userId      用户ID
     * @param serviceType 服务类型
     * @return AI配置
     */
    AiConfig getUserAiConfig(Long userId, String serviceType);

    /**
     * 检查AI服务可用性
     *
     * @param serviceType 服务类型
     * @param userId      用户ID
     * @return 是否可用
     */
    boolean checkServiceAvailability(String serviceType, Long userId);

    /**
     * 获取AI服务使用统计
     *
     * @param userId 用户ID
     * @return 使用统计
     */
    Map<String, Object> getAiUsageStats(Long userId);

    /**
     * 批量处理图片标签识别
     *
     * @param materialIds 素材ID列表
     * @param userId      用户ID
     * @return 处理结果
     */
    Map<Long, List<TagDTO>> batchRecognizeImageTags(List<Long> materialIds, Long userId);

    /**
     * 批量生成文案
     *
     * @param materialIds 素材ID列表
     * @param contentType 内容类型
     * @param style       风格
     * @param userId      用户ID
     * @return 生成结果
     */
    Map<Long, String> batchGenerateCopywriting(List<Long> materialIds, String contentType, String style, Long userId);

    /**
     * 获取支持的AI服务类型
     *
     * @return 服务类型列表
     */
    List<String> getSupportedServiceTypes();

    /**
     * 获取支持的AI提供商
     *
     * @return 提供商列表
     */
    List<String> getSupportedProviders();

    /**
     * 获取支持的AI模型
     *
     * @param provider    提供商
     * @param serviceType 服务类型
     * @return 模型列表
     */
    List<String> getSupportedModels(String provider, String serviceType);

    /**
     * 测试AI配置连接
     *
     * @param configId 配置ID
     * @param userId   用户ID
     * @return 测试结果
     */
    Map<String, Object> testAiConfig(Long configId, Long userId);

    /**
     * 获取AI服务价格信息
     *
     * @param serviceType 服务类型
     * @param provider    提供商
     * @return 价格信息
     */
    Map<String, Object> getServicePricing(String serviceType, String provider);

    /**
     * 计算AI服务消耗成本
     *
     * @param serviceType  服务类型
     * @param provider     提供商
     * @param model        模型
     * @param inputTokens  输入token数
     * @param outputTokens 输出token数
     * @return 消耗成本
     */
    Double calculateServiceCost(String serviceType, String provider, String model, Long inputTokens, Long outputTokens);

    /**
     * 获取用户AI配额使用情况
     *
     * @param userId 用户ID
     * @return 配额使用情况
     */
    Map<String, Object> getUserQuotaUsage(Long userId);

    /**
     * 重置用户每日配额
     *
     * @param userId 用户ID
     * @return 重置结果
     */
    boolean resetUserDailyQuota(Long userId);
}